package com.test.springboot_test.test03_saToken.SecurityCertification;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Sa-token 权限认证示例
 */
@RestController
@RequestMapping("/jur/")
public class JurAuthController {

    /**
     * 前提1：首先登录接口进行登录，代码在： com.pj.cases.use.LoginAuthController 有详细解释，此处不再赘述
     *  --------------http://localhost:8080/acc/doLogin?name=zhang&pwd=123456
     *  前提2：项目实现 StpInterface接口， 代码在 com.pj.satoken.StpInterfaceImpl
     *  然后我们就可以使用代码进行鉴权了
     */
    /**
     * 获取权限
     * @return
     */
    @RequestMapping("getPermission")
    public SaResult getPermission() {
        //查询权限信息，如果当前会话未登录，会返回一个空集合
        List<String> permissionList = StpUtil.getPermissionList();
        System.out.println("当前登录账号拥有的所有权限：" + permissionList);

        //查询角色信息，如果当前会话未登录，会返回一个空集合
        List<String> roleList = StpUtil.getRoleList();
        System.out.println("当前帐号拥有的所有角色" + roleList);

        return SaResult.ok()
                .set("permissionList", permissionList)
                .set("roleList", roleList);
    }

    //权限校验  ------------http://localhost:8081/jur/checkPermission
    @RequestMapping("checkPermission")
    public SaResult checkPermission() {
        //判断：当前帐号是否拥有一个权限，返回true或false
        //如果账号未登录，则永远返回false
        //StpUtil.hasPermission("user.add");
        //StpUtil.hasPermissionAnd("user.add","user.delete","user.get");//指定多个，必须全部拥有才会返回true
        //StpUtil.hasPermissionOr("user.add","user.update","user.get");//指定多个只要有一个满足条件，就返回true

        //判断---校验成功 返回true  --- 校验失败 返回false
        //判断是否有权限  如果有订单的增删改查权限，则返回true
        if(
                StpUtil.hasPermission("order.add")
                &&
                StpUtil.hasPermission("order.delete")&&
                StpUtil.hasPermission("order.update")&&
                StpUtil.hasPermission("order.query")
                        //&&StpUtil.hasPermission("*")
        ){
            System.out.println("有该订单的增删改查的权限");
        }

        //校验：当前账号是否拥有一个权限，校验不通过会抛出'NotPersionException'异常
        //如果当前账号未登录，等会校验失败
        StpUtil.checkPermission("user.add");
        //下面两个测试是有问题的，明明有错误，却没报错
        StpUtil.hasPermissionAnd("g","user.add","user.delete");
        StpUtil.hasPermissionOr("geta");

        return SaResult.ok();

    }
    //角色校验      ----------     http://localhost:8080/jur/checkRole
    @RequestMapping("checkRole")
    public SaResult checkRole(){
        //判断：当前账号是否拥有一个角色，拥有返回true，否则返回false
        //如果当前账号未登录，则永远返回false
        StpUtil.checkRole("admin");
        StpUtil.checkRoleAnd("admin","ceo","cfo");//指定多个，必须全部拥有才算通过
        StpUtil.checkRoleOr("admin","ceo","cfo");//指定多个，只要有一个就会校验通过
        return SaResult.ok();
    }

    //权限通配符------ http://localhost:8081/jur/wildcardPermission
    @RequestMapping("wildcardPermission")
    public SaResult wildcardPermission(){
        //前提条件：在 StpInterface 实现类中，为账号返回了art.* 泛权限
        StpUtil.hasPermission("art.add");//返回true
        StpUtil.hasPermission("art.delete");//返回true
        StpUtil.hasPermission("goods.add");//返回false，因为前缀不符合
        // * 符合可以出现在任意位置，比如权限码的开头，当账号拥有 "*.delete"时
        StpUtil.hasPermission("goods.add");
        StpUtil.hasPermission("goods.delete");
        StpUtil.hasPermission("art.delete");
        //也可以出现在权限码的中间，比如当账号拥有 "shop.*.user"时
        StpUtil.hasPermission("shop.add.user");//true
        StpUtil.hasPermission("shop.delete.user");//true
        StpUtil.hasPermission("shop.delete.goods");//false,因为后缀不符合

        StpUtil.hasPermission("user.add");
        //注意点
        //1.上帝权限：当一个账号拥有"*"权限时，它可以验证通过任何权限码
        //2.角色校验也可以加 * ，指定泛角色
        return SaResult.ok();
    }






}
